package com.sise.thread.lab01.lab03;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 作者：idea
 * 日期：2018/6/12
 * 描述：
 */

// 解释一下： 首先是read and load操作，会将主存里面的变量赋值到了当前的工作内存里面
//    use and assign执行代码，当某一条线程执行运算的时候有引用到count变量的话，就会将
//    主存里面count变量的值和本地线程里面count变量的值统一一下，但是这样仍然避免不了线程安全的问题


public class Counter {
    public volatile static AtomicInteger count = new AtomicInteger(0);

    public static void inc() {

        //这里延迟1毫秒，使得结果明显
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
        }

        count.incrementAndGet();
    }

    public static void main(String[] args) {

        //同时启动1000个线程，去进行i++计算，看看实际结果

        for (int i = 0; i < 1000; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Counter.inc();
                }
            }).start();
        }

        //这里每次运行的值都有可能不同,可能为1000
        System.out.println("运行结果:Counter.count=" + Counter.count);
    }
}
